package com.sfh.cpc.com.req;

import com.sfh.cpc.com.entity.RspBase;
import com.sfh.cpc.com.lub.Luban;
import com.sfh.lib.AppCacheManager;
import com.sfh.lib.http.HttpMediaType;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import okio.BufferedSink;
import okio.Okio;

/**
 * 功能描述:
 *
 * @author SunFeihu 孙飞虎
 * @date 2019/5/8
 */
public class ReqFile extends ReqBase<RspBase<String>> {
    File file;

    private transient String filePath;

    public ReqFile(String filePath) {
        super("sys/upFile");
        this.setMediaType(HttpMediaType.MEDIA_TYPE_MULTIPART_FORM);
        this.filePath = filePath;
    }

    @Override
    public Object buildParam() {
        file = runZipOrNewFile(filePath);
        return super.buildParam();
    }

    /***
     * 压缩与创建新文件
     * @return
     */
    private File runZipOrNewFile(String path) {

        File oldFile = new File(path);
        // 压缩文件
        if (oldFile == null || !oldFile.exists()) {
            return null;
        }
        int waitSize = 0;
        // 防止部分手机拍照图片为空
        while (oldFile.length() <= 0 && waitSize < 15) {
            try {
                waitSize++;
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        String newFileName = getFileName(oldFile.getName());
        //生产新的文件
        File newFile = new File(AppCacheManager.getFileCache(), newFileName);

        try {

            // 文件过大进行压缩 = 文件大于200KB并且图片未压缩过
            newFile = new Luban().leastCompressSize(300).load(oldFile.getAbsolutePath()).compress(newFile);
            if (newFile == null || !newFile.exists() || newFile.length() <= 0) {

                if (newFile.createNewFile()) {
                    // 复制文件
                    BufferedSink sink = Okio.buffer(Okio.sink(newFile));
                    sink.writeAll(Okio.source(oldFile));
                    sink.flush();
                    sink.close();
                } else {
                    // 使用旧文件直接修改文件名
                    File newNameFile = new File(oldFile.getParentFile(), newFileName);
                    if (oldFile.renameTo(newNameFile)) {
                        newFile = newNameFile;
                    }
                }
            }

        } catch (Exception e) {
            newFile = oldFile;
        }
        return newFile;
    }

    /***
     * 创建文件名
     * @return
     */
    public String getFileName(String name) {

        // 文件类型
        int separatorIndex = name.lastIndexOf(".");
        String suffix = (separatorIndex < 0) ? "" : name.substring(separatorIndex);
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String date = format.format(new Date());
        // 用户ID+时间+随机数 + 文件类型
        return String.format("%s%s%s%s", "cpc", date, getRandom(), suffix);
    }

    /**
     * 生成文件名随机数
     *
     * @return
     */
    String getRandom() {

        Random random = new Random();
        StringBuffer randomBf = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            randomBf.append(random.nextInt(9));
        }
        return randomBf.toString();
    }
}
